package com.dyb.demo.test_thread;

public class TestSynchronized {

    /**
     * 锁对象一致则同步，反之则异步。
     * synchronized 修饰的方法，在同一个类实例下是同步的；
     *  - synchronized是对类的当前实例（当前对象）进行加锁，防止其他线程同时访问该类的该实例的所有synchronized块，
     *  - 注意这里是“类的当前实例”， 类的两个不同实例就没有这种约束了。
     * static synchronized 修饰的方法，在类的所有实例下是同步的；
     * - static synchronized 是对类的所有实例进行加锁，是类级别的，一个监视器，监控所有实例；
     * synchronized 和 static synchronized 互不干扰，可以异步执行；
     * @param args
     */
    public static void main(String[] args) {
        TestSynchronized test = new TestSynchronized();
        // 普通方法
        new Thread(() -> {
            test.method1();
        }).start();
        new Thread(() -> {
            test.method2();
        }).start();
        // 静态同步方法
        new Thread(() -> {
            staticMethod1();
        }).start();
        new Thread(() -> {
            staticMethod2();
        }).start();
    }

    private synchronized void method1() {
        try {
            System.out.println("start method1");
            Thread.sleep(3000);
            System.out.println("end method1");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private synchronized void method2() {
        try {
            System.out.println("start method2");
            Thread.sleep(2000);
            System.out.println("end method2");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private static synchronized void staticMethod1() {
        try {
            System.out.println("start staticMethod1");
            Thread.sleep(2500);
            System.out.println("end staticMethod1");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private static synchronized void staticMethod2() {
        try {
            System.out.println("start staticMethod2");
            Thread.sleep(3000);
            System.out.println("end staticMethod2");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
